home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adatutor / lrmrdr / make_cit.a < prev    next >
Text File  |  1996-01-30  |  12KB  |  335 lines

  1. -- Make_CIT by Rick Conn
  2. -- Scan Ada LRM Chapter Files for section numbers and extract them
  3. -- into a file.  Then use that file to build the CIT.ADA file,
  4. -- which is the source to package CIT.
  5.  
  6. -- COPYRIGHT NOTICE
  7. -- Ada LRM Reader - Interactive Presentation of the Ada LRM
  8. -- Copyright (C) 1992    Richard Conn
  9. --
  10. -- This program is free software; you can redistribute it
  11. -- and/or modify it under the terms of the GNU General Public
  12. -- License Version 1 as published by the Free Software
  13. -- Foundation.
  14. --
  15. -- This program is distributed in the hope that it will be
  16. -- useful, but WITHOUT ANY WARRANTY; without even the implied
  17. -- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  18. -- PURPOSE.  See the GNU General Public License for more
  19. -- details.  You should have received a copy of the GNU General
  20. -- Public License along with this program; if not, write to the
  21. -- Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
  22. -- 02139, USA.  See the ABOUT screens for further information,
  23. -- including information on how to contact the author.
  24.  
  25. with SYSDEP;
  26. with DAF_Handler;
  27. with Output_File;  -- CS Parts
  28. with Console;      -- CS Parts
  29. procedure Make_CIT is
  30.  
  31.   use DAF_Handler;  -- for equality and inequality tests
  32.  
  33.   subtype FN_STRING is STRING(1..10);
  34.   type FN_VECTOR is array (NATURAL range <>) of FN_STRING;
  35.   File_Names : constant FN_VECTOR := (
  36.     "chap01.daf", "chap02.daf", "chap03.daf", "chap04.daf",
  37.     "chap05.daf", "chap06.daf", "chap07.daf", "chap08.daf",
  38.     "chap09.daf", "chap10.daf", "chap11.daf", "chap12.daf",
  39.     "chap13.daf", "chap14.daf", "chapaa.daf", "chapab.daf",
  40.     "chapac.daf", "chapad.daf", "chapae.daf", "chapaf.daf"
  41.     );
  42.  
  43.   subtype FILE_ID_STRING is STRING (1..2);
  44.   type CITATION_RECORD is record
  45.     Citation_ID      : STRING(1..20);
  46.     Citation_ID_Last : NATURAL;
  47.     File_ID          : FILE_ID_STRING;
  48.     Start            : DAF_Handler.LINE_NUMBER;
  49.     Stop             : DAF_Handler.LINE_NUMBER;
  50.   end record;
  51.  
  52.   type CITATION_RECORD_VECTOR is
  53.     array (1..SYSDEP.Total_Number_of_Citations) of CITATION_RECORD;
  54.  
  55.   CRV      : CITATION_RECORD_VECTOR;
  56.   Next_CRV : DAF_Handler.LINE_NUMBER := 1;
  57.  
  58.   Package_File_Name     : constant STRING := "CIT.ADA";
  59.   Output_File_ID        : Output_File.FILE_TYPE;
  60.  
  61.   ----------------------------------------------------------------
  62.   -- Set Citation_ID and Citation_ID_Last fields of CRV(Next_CRV)
  63.   procedure Set_Citation_ID (Item : in STRING;
  64.                              File_ID : in STRING) is
  65.   begin -- Set_Citation_ID
  66.     CRV(Next_CRV).Citation_ID(1..Item'LENGTH) := Item;
  67.     CRV(Next_CRV).Citation_ID_Last            := Item'LENGTH;
  68.     CRV(Next_CRV).File_ID                     := File_ID;
  69.   end Set_Citation_ID;
  70.  
  71.   ----------------------------------------------------------------
  72.   -- Make entry of the form CITATION,chn,m where CITATION is the
  73.   -- citation name, ch is the last 2 character in the chapter name,
  74.   -- n is the 1st line number, and m is the last line number
  75.   procedure Process_File (Name : in STRING) is
  76.  
  77.     Inline      : DAF_Handler.LINE;
  78.     Line_Number : NATURAL := 0;
  79.     First_Time  : BOOLEAN := TRUE;
  80.     Input_File  : DAF_Handler.DAF_ID;
  81.     Start_Col   : NATURAL;
  82.     Stop_Col    : NATURAL;
  83.  
  84.   begin -- Process_File
  85.  
  86.     Console.Put_Line ("Processing File " & Name);
  87.     Input_File := DAF_Handler.Open (Name);
  88.  
  89.     -- loop until end of input file
  90.     while not DAF_Handler.Is_End_of_File (Input_File) loop
  91.  
  92.       Inline := DAF_Handler.Read_Next (Input_File);
  93.       Line_Number := Line_Number + 1;
  94.  
  95.       -- process a new section
  96.       if Inline.Kind = DAF_Handler.SECTION then
  97.  
  98.         -- close out entry for old section if not the first time
  99.         if not First_Time then
  100.           CRV(Next_CRV).Stop := Line_Number - 1;
  101.           Next_CRV           := Next_CRV + 1;
  102.         end if;
  103.         First_Time := FALSE;
  104.  
  105.         -- find start of section citation
  106.         Start_Col := 0;
  107.         for I in 1 .. Inline.Str_Last loop
  108.           if Inline.Str(I) > ' ' then
  109.             Start_Col := I;
  110.             exit;
  111.           end if;
  112.         end loop;
  113.  
  114.         -- check for error
  115.         if Start_Col > 0 then
  116.  
  117.           -- find end of section citation
  118.           for I in Start_Col .. Inline.Str_Last loop
  119.             if Inline.Str(I) <= ' ' then
  120.               Stop_Col := I-1;
  121.               exit;
  122.             end if;
  123.             Stop_Col := I;
  124.           end loop;
  125.  
  126.           -- change dots in section citation to P's
  127.           for I in Start_Col .. Stop_Col loop
  128.             if Inline.Str(I) = '.' then
  129.               Inline.Str(I) := 'P';
  130.             end if;
  131.           end loop;
  132.  
  133.           -- strip off trailing P if any
  134.           if Inline.Str(Stop_Col) = 'P' then
  135.             Stop_Col := Stop_Col - 1;
  136.           end if;
  137.  
  138.           -- start entry for section citation
  139.           Set_Citation_ID('C' & Inline.Str(Start_Col..Stop_Col),
  140.                           Name(Name'FIRST+4 .. Name'FIRST+5));
  141.           CRV(Next_CRV).Start := Line_Number;
  142.  
  143.         end if; -- error check
  144.  
  145.       end if; -- section processing
  146.  
  147.     end loop;
  148.  
  149.     -- close out last citation if any
  150.     if not First_Time then
  151.       CRV(Next_CRV).Stop := Line_Number;
  152.       Next_CRV           := Next_CRV + 1;
  153.     end if;
  154.  
  155.     -- close input file but leave output file open for next pass
  156.     DAF_Handler.Close (Input_File);
  157.  
  158.   exception -- Process_Line
  159.     when DAF_Handler.FILE_NOT_FOUND =>
  160.       Console.Put_Line ("  File not found");
  161.     when DAF_Handler.NO_DAF_OPEN    =>
  162.       Console.Put_Line ("  File not open");
  163.     when DAF_Handler.READ_ERROR     =>
  164.       Console.Put_Line ("  Read error on file");
  165.     when DAF_Handler.STACK_OVERFLOW =>
  166.       Console.Put_Line ("  Stack overflow");
  167.     when others =>
  168.       Console.Put_Line ("  Unexpected Error");
  169.   end Process_File;
  170.  
  171.   ----------------------------------------------------------------
  172.   -- Make entry of the form Enum,ch1,m where Enum is the
  173.   -- citation name, ch is the last 2 characters in the chapter name,
  174.   -- 1 is the 1st line number, and m is the last line number
  175.   procedure Count_Lines (Name : in STRING; Enum : in STRING) is
  176.  
  177.     Inline      : DAF_Handler.LINE;
  178.     Input_File  : DAF_Handler.DAF_ID;
  179.     Line_Number : NATURAL := 0;
  180.  
  181.   begin -- Count_Lines
  182.  
  183.     Console.Put_Line ("Processing File " & Name);
  184.     Input_File := DAF_Handler.Open (Name);
  185.  
  186.     -- loop over file, counting lines
  187.     while not DAF_Handler.Is_End_of_File (Input_File) loop
  188.       Inline := DAF_Handler.Read_Next (Input_File);
  189.       Line_Number := Line_Number + 1;
  190.     end loop;
  191.  
  192.     -- store results and close input file
  193.     Set_Citation_ID (Enum, Name(Name'FIRST+4 .. Name'FIRST+5));
  194.     CRV(Next_CRV).Start := 1;
  195.     CRV(Next_CRV).Stop  := Line_Number;
  196.     Next_CRV            := Next_CRV + 1;
  197.     DAF_Handler.Close (Input_File);
  198.  
  199.   exception
  200.     when DAF_Handler.FILE_NOT_FOUND =>
  201.       Console.Put_Line ("  File not found");
  202.     when DAF_Handler.NO_DAF_OPEN    =>
  203.       Console.Put_Line ("  File not open");
  204.     when DAF_Handler.READ_ERROR     =>
  205.       Console.Put_Line ("  Read error on file");
  206.     when DAF_Handler.STACK_OVERFLOW =>
  207.       Console.Put_Line ("  Stack overflow");
  208.     when others =>
  209.       Console.Put_Line ("  Unexpected Error");
  210.   end Count_Lines;
  211.  
  212. begin -- Make_CIT
  213.  
  214.   Console.Put_Line (Package_File_Name & " File Builder");
  215.   for I in SYSDEP.Intro_Copyright_Notice'RANGE loop
  216.     Console.Put_Line (SYSDEP.Intro_Copyright_Notice(I));
  217.   end loop;
  218.  
  219.   -- Build CRV array
  220.   for I in File_Names'RANGE loop
  221.     Process_File (File_Names(I));
  222.   end loop;
  223.   Count_Lines ("chapco.daf", "CONTENTS");
  224.   Count_Lines ("chapfo.daf", "FOREWARD");
  225.   Count_Lines ("chapin.daf", "INDEX");
  226.   Count_Lines ("chappo.daf", "POSTSCRIPT");
  227.   Count_Lines ("chaphe.daf", "HELP");
  228.   Count_Lines ("chapxx.daf", "ABOUT");
  229.  
  230.   -- Create the Package file
  231.   Output_File.Create (Output_File_ID, Package_File_Name);
  232.  
  233.   -- Part 1 -- Build CITATION enumerated type
  234.   -- Output specification of package
  235.   Output_File.Put_Line (Output_File_ID, "with DAF_Handler;");
  236.   Output_File.Put_Line (Output_File_ID, "package Citation_Definition is");
  237.   Output_File.New_Line (Output_File_ID);
  238.  
  239.   -- Output enumeration type CITATION
  240.   Output_File.Put_Line (Output_File_ID, "  type CITATION_ID is (");
  241.   for I in 1 .. Next_CRV-1 loop
  242.     Output_File.Put_Line (Output_File_ID, "    " &
  243.        CRV(I).Citation_ID(1..CRV(I).Citation_ID_Last) & ",");
  244.   end loop;
  245.   Output_File.Put_Line (Output_File_ID,
  246.     "    ERROR,");
  247.   Output_File.Put_Line (Output_File_ID,
  248.     "  -- Commands for immediate execution");
  249.   Output_File.Put_Line (Output_File_ID,
  250.     "    N, P,");
  251.   Output_File.Put_Line (Output_File_ID,
  252.     "    USER_INPUT, PRINT, PS,");
  253.   Output_File.Put_Line (Output_File_ID,
  254.     "    NEXT, PREVIOUS, PAUSE, PUSH, POP,");
  255.   Output_File.Put_Line (Output_File_ID,
  256.     "    SEARCH_FIRST, SEARCH_NEXT, REFRESH,");
  257.   Output_File.Put_Line (Output_File_ID,
  258.     "    QUIT");
  259.   Output_File.Put_Line (Output_File_ID,
  260.     "  );");
  261.   Output_File.New_Line (Output_File_ID);
  262.  
  263.   -- Part 2 - Build array of chapter and line indexes
  264.  
  265.   -- Output text of CITATION_KEY record
  266.   Output_File.Put_Line (Output_File_ID,
  267.     "  type CITATION_LOCATION is record");
  268.   Output_File.Put_Line (Output_File_ID,
  269.     "    Chapter : STRING(1..2);");
  270.   Output_File.Put_Line (Output_File_ID,
  271.     "    Start   : DAF_Handler.LINE_NUMBER;");
  272.   Output_File.Put_Line (Output_File_ID,
  273.     "    Stop    : DAF_Handler.LINE_NUMBER;");
  274.   Output_File.Put_Line (Output_File_ID,
  275.     "  end record;");
  276.   Output_File.New_Line (Output_File_ID);
  277.  
  278.   -- Output text of type CITATION_LOCATION_VECTOR
  279.   Output_File.Put_Line (Output_File_ID,
  280.     "  type CITATION_LOCATION_VECTOR is array (CITATION_ID) of");
  281.   Output_File.Put_Line (Output_File_ID, "    CITATION_LOCATION;");
  282.   Output_File.New_Line (Output_File_ID);
  283.  
  284.   -- Output vector CKV
  285.   Output_File.Put_Line (Output_File_ID,
  286.     "  CLV : constant CITATION_LOCATION_VECTOR := (");
  287.   for I in 1 .. Next_CRV-1 loop
  288.     Output_File.Put_Line (Output_File_ID, "    " &
  289.         CRV(I).Citation_ID(1..CRV(I).Citation_ID_Last) & " => (" &
  290.         '"' & CRV(I).File_ID & '"' & "," &
  291.         NATURAL'IMAGE(CRV(I).Start) & "," &
  292.         NATURAL'IMAGE(CRV(I).Stop) & "),");
  293.   end loop;
  294.  
  295.   -- Output special cases of CKV
  296.   Output_File.Put_Line (Output_File_ID,
  297.     "    ERROR        => (" & '"' & "  " & '"' & ", 1, 1),");
  298.   Output_File.Put_Line (Output_File_ID,
  299.     "    N            => (" & '"' & "  " & '"' & ", 1, 1),");
  300.   Output_File.Put_Line (Output_File_ID,
  301.     "    P            => (" & '"' & "  " & '"' & ", 1, 1),");
  302.   Output_File.Put_Line (Output_File_ID,
  303.     "    USER_INPUT   => (" & '"' & "  " & '"' & ", 1, 1),");
  304.   Output_File.Put_Line (Output_File_ID,
  305.     "    PRINT        => (" & '"' & "  " & '"' & ", 1, 1),");
  306.   Output_File.Put_Line (Output_File_ID,
  307.     "    PS           => (" & '"' & "  " & '"' & ", 1, 1),");
  308.   Output_File.Put_Line (Output_File_ID,
  309.     "    NEXT         => (" & '"' & "  " & '"' & ", 1, 1),");
  310.   Output_File.Put_Line (Output_File_ID,
  311.     "    PREVIOUS     => (" & '"' & "  " & '"' & ", 1, 1),");
  312.   Output_File.Put_Line (Output_File_ID,
  313.     "    PAUSE        => (" & '"' & "  " & '"' & ", 1, 1),");
  314.   Output_File.Put_Line (Output_File_ID,
  315.     "    PUSH         => (" & '"' & "  " & '"' & ", 1, 1),");
  316.   Output_File.Put_Line (Output_File_ID,
  317.     "    POP          => (" & '"' & "  " & '"' & ", 1, 1),");
  318.   Output_File.Put_Line (Output_File_ID,
  319.     "    SEARCH_FIRST => (" & '"' & "  " & '"' & ", 1, 1),");
  320.   Output_File.Put_Line (Output_File_ID,
  321.     "    SEARCH_NEXT  => (" & '"' & "  " & '"' & ", 1, 1),");
  322.   Output_File.Put_Line (Output_File_ID,
  323.     "    REFRESH      => (" & '"' & "  " & '"' & ", 1, 1),");
  324.   Output_File.Put_Line (Output_File_ID,
  325.     "    QUIT         => (" & '"' & "  " & '"' & ", 1, 1)");
  326.   Output_File.Put_Line (Output_File_ID, "  );");
  327.  
  328.   -- Close output file
  329.   Output_File.New_Line (Output_File_ID);
  330.   Output_File.Put_Line (Output_File_ID, "end Citation_Definition;");
  331.   Output_File.Close (Output_File_ID);
  332.   Console.Put_Line ("File " & Package_File_Name & " created");
  333.  
  334. end Make_CIT;
  335.